JavaScriptãžã§ãã¬ãŒã¿é¢æ°ã®åææè¡ãæ¢æ±ããæè»ã§åŒ·åãªããŒã¿åŠçãã€ãã©ã€ã³ãæ§ç¯ããæ¹æ³ã解説ããŸãã
JavaScriptãžã§ãã¬ãŒã¿é¢æ°ã®åæïŒãžã§ãã¬ãŒã¿ãã§ãŒã³ã®æ§ç¯
JavaScriptã®ãžã§ãã¬ãŒã¿é¢æ°ã¯ãã€ãã©ãã«ãªã·ãŒã±ã³ã¹ãäœæããããã®åŒ·åãªæ¹æ³ãæäŸããŸããå®è¡ãäžæåæ¢ããŠå€ãyieldïŒçæïŒããããšã§ãå¹ççã§æè»ãªããŒã¿åŠçãå¯èœã«ããŸãããžã§ãã¬ãŒã¿ã®æãè峿·±ãæ©èœã®äžã€ã¯ãããããçµã¿åãããŠåæããæŽç·ŽãããããŒã¿ãã€ãã©ã€ã³ãäœæã§ããããšã§ãããã®èšäºã§ã¯ããžã§ãã¬ãŒã¿é¢æ°ã®åæã®æŠå¿µãæãäžããè€éãªåé¡ã解決ããããã®ãžã§ãã¬ãŒã¿ãã§ãŒã³ãæ§ç¯ããããã®æ§ã ãªãã¯ããã¯ãæ¢ããŸãã
JavaScriptãžã§ãã¬ãŒã¿é¢æ°ãšã¯ïŒ
åæã«ã€ããŠè©³ããèŠãåã«ããžã§ãã¬ãŒã¿é¢æ°ã«ã€ããŠç°¡åã«åŸ©ç¿ããŸãããããžã§ãã¬ãŒã¿é¢æ°ã¯function*æ§æã䜿çšããŠå®çŸ©ãããŸãããžã§ãã¬ãŒã¿é¢æ°å
ã§ã¯ãyieldããŒã¯ãŒããå®è¡ãäžæåæ¢ããŠå€ãè¿ãããã«äœ¿çšãããŸãããžã§ãã¬ãŒã¿ã®next()ã¡ãœãããåŒã³åºããããšãå®è¡ã¯äžæãããå Žæããåéãããæ¬¡ã®yieldæãŸãã¯é¢æ°ã®çµããã«éãããŸã§ç¶ããŸãã
ç°¡åãªäŸã以äžã«ç€ºããŸãïŒ
function* numberGenerator(max) {
for (let i = 0; i <= max; i++) {
yield i;
}
}
const generator = numberGenerator(5);
console.log(generator.next()); // Output: { value: 0, done: false }
console.log(generator.next()); // Output: { value: 1, done: false }
console.log(generator.next()); // Output: { value: 2, done: false }
console.log(generator.next()); // Output: { value: 3, done: false }
console.log(generator.next()); // Output: { value: 4, done: false }
console.log(generator.next()); // Output: { value: 5, done: false }
console.log(generator.next()); // Output: { value: undefined, done: true }
ãã®ãžã§ãã¬ãŒã¿é¢æ°ã¯ã0ããæå®ãããæå€§å€ãŸã§ã®æ°å€ãyieldããŸããnext()ã¡ãœããã¯ãvalueïŒyieldãããå€ïŒãšdoneïŒãžã§ãã¬ãŒã¿ãçµäºãããã©ããã瀺ãããŒã«å€ïŒã®2ã€ã®ããããã£ãæã€ãªããžã§ã¯ããè¿ããŸãã
ãªããžã§ãã¬ãŒã¿é¢æ°ãåæããã®ãïŒ
ãžã§ãã¬ãŒã¿é¢æ°ãåæããããšã§ãã¢ãžã¥ãŒã«åŒã§åå©çšå¯èœãªããŒã¿åŠçãã€ãã©ã€ã³ãäœæã§ããŸãããã¹ãŠã®åŠçã¹ããããå®è¡ããåäžã®å·šå€§ãªãžã§ãã¬ãŒã¿ãäœæãã代ããã«ãåé¡ãããå°ãã管çãããããžã§ãã¬ãŒã¿ã«åå²ãããããããç¹å®ã®ã¿ã¹ã¯ãæ åœããããã«ã§ããŸãããããã®ãžã§ãã¬ãŒã¿ãé£çµããŠãå®å šãªãã€ãã©ã€ã³ã圢æããããšãã§ããŸãã
åæã®å©ç¹ãšããŠä»¥äžãæããããŸãïŒ
- ã¢ãžã¥ãŒã«æ§ïŒåãžã§ãã¬ãŒã¿ã¯åäžã®è²¬åãæã€ãããã³ãŒãã®çè§£ãšä¿å®ã容æã«ãªããŸãã
- åå©çšæ§ïŒãžã§ãã¬ãŒã¿ã¯ç°ãªããã€ãã©ã€ã³ã§åå©çšã§ããã³ãŒãã®éè€ãæžãããŸãã
- ãã¹ãå®¹ææ§ïŒå°ããªãžã§ãã¬ãŒã¿ã¯åäœã§ãã¹ãããã®ã容æã§ãã
- æè»æ§ïŒãžã§ãã¬ãŒã¿ã远å ãåé€ããŸãã¯äžŠã¹æ¿ããããšã§ããã€ãã©ã€ã³ãç°¡åã«å€æŽã§ããŸãã
ãžã§ãã¬ãŒã¿é¢æ°ãåæãããã¯ããã¯
JavaScriptã§ãžã§ãã¬ãŒã¿é¢æ°ãåæããã«ã¯ãããã€ãã®ãã¯ããã¯ããããŸããæãäžè¬çãªã¢ãããŒãã®ããã€ããæ¢ã£ãŠã¿ãŸãããã
1. ãžã§ãã¬ãŒã¿ããªã²ãŒã·ã§ã³ïŒyield*ïŒ
yield*ããŒã¯ãŒãã¯ãå¥ã®ãžã§ãã¬ãŒã¿é¢æ°ãå«ããä»ã®ã€ãã©ãã«ãªããžã§ã¯ãã«åŠçãå§è²ãã䟿å©ãªæ¹æ³ãæäŸããŸããyield*ã䜿çšããããšãå§è²ãããã€ãã©ãã«ã«ãã£ãŠyieldãããå€ã¯ãçŸåšã®ãžã§ãã¬ãŒã¿ã«ãã£ãŠçŽæ¥yieldãããŸãã
以äžã¯ãyield*ã䜿çšããŠ2ã€ã®ãžã§ãã¬ãŒã¿é¢æ°ãåæããäŸã§ãïŒ
function* generateEvenNumbers(max) {
for (let i = 0; i <= max; i++) {
if (i % 2 === 0) {
yield i;
}
}
}
function* prependMessage(message, iterable) {
yield message;
yield* iterable;
}
const evenNumbers = generateEvenNumbers(10);
const messageGenerator = prependMessage("Even Numbers:", evenNumbers);
for (const value of messageGenerator) {
console.log(value);
}
// Output:
// Even Numbers:
// 0
// 2
// 4
// 6
// 8
// 10
ãã®äŸã§ã¯ãprependMessageã¯ã¡ãã»ãŒãžãyieldãããã®åŸyield*ã䜿çšããŠgenerateEvenNumbersãžã§ãã¬ãŒã¿ã«åŠçãå§è²ããŸããããã«ããã2ã€ã®ãžã§ãã¬ãŒã¿ã广çã«1ã€ã®ã·ãŒã±ã³ã¹ã«çµåãããŸãã
2. æåã§ã®ã€ãã¬ãŒã·ã§ã³ãšyield
å§è²ããããžã§ãã¬ãŒã¿ãå埩åŠçãããã®å€ãyieldããããšã§ããžã§ãã¬ãŒã¿ãæåã§åæããããšãã§ããŸãããã®ã¢ãããŒãã¯åæããã»ã¹ããã詳现ã«å¶åŸ¡ã§ããŸãããããå€ãã®ã³ãŒããå¿ èŠã«ãªããŸãã
function* generateOddNumbers(max) {
for (let i = 0; i <= max; i++) {
if (i % 2 !== 0) {
yield i;
}
}
}
function* appendMessage(iterable, message) {
for (const value of iterable) {
yield value;
}
yield message;
}
const oddNumbers = generateOddNumbers(9);
const messageGenerator = appendMessage(oddNumbers, "End of Sequence");
for (const value of messageGenerator) {
console.log(value);
}
// Output:
// 1
// 3
// 5
// 7
// 9
// End of Sequence
ãã®äŸã§ã¯ãappendMessageã¯for...ofã«ãŒãã䜿çšããŠoddNumbersãžã§ãã¬ãŒã¿ãå埩åŠçããåå€ãyieldããŸãããžã§ãã¬ãŒã¿å
šäœãå埩åŠçããåŸãæåŸã®ã¡ãã»ãŒãžãyieldããŸãã
3. é«é颿°ã«ãã颿°çåæ
é«é颿°ã䜿çšãããšããã颿°çã§å®£èšçãªã¹ã¿ã€ã«ã®ãžã§ãã¬ãŒã¿åæãäœæã§ããŸããããã«ã¯ããžã§ãã¬ãŒã¿ãå ¥åãšããŠåãåããããŒã¿ã¹ããªãŒã ã«å€æãé©çšããæ°ãããžã§ãã¬ãŒã¿ãè¿ã颿°ãäœæããããšãå«ãŸããŸãã
function* numberRange(start, end) {
for (let i = start; i <= end; i++) {
yield i;
}
}
function mapGenerator(generator, transform) {
return function*() {
for (const value of generator) {
yield transform(value);
}
};
}
function filterGenerator(generator, predicate) {
return function*() {
for (const value of generator) {
if (predicate(value)) {
yield value;
}
}
};
}
const numbers = numberRange(1, 10);
const squaredNumbers = mapGenerator(numbers, x => x * x)();
const evenSquaredNumbers = filterGenerator(squaredNumbers, x => x % 2 === 0)();
for (const value of evenSquaredNumbers) {
console.log(value);
}
// Output:
// 4
// 16
// 36
// 64
// 100
ãã®äŸã§ã¯ãmapGeneratorãšfilterGeneratorã¯ããžã§ãã¬ãŒã¿ãšå€æé¢æ°ãŸãã¯è¿°èªé¢æ°ãå
¥åãšããŠåãåãé«é颿°ã§ãããããã¯ãå
ã®ãžã§ãã¬ãŒã¿ã«ãã£ãŠyieldãããå€ã«å€æãŸãã¯ãã£ã«ã¿ãé©çšããæ°ãããžã§ãã¬ãŒã¿é¢æ°ãè¿ããŸããããã«ããããããã®é«é颿°ãé£çµããããšã§è€éãªãã€ãã©ã€ã³ãæ§ç¯ã§ããŸãã
4. ãžã§ãã¬ãŒã¿ãã€ãã©ã€ã³ã©ã€ãã©ãªïŒäŸïŒIxJSïŒ
ããã€ãã®JavaScriptã©ã€ãã©ãªã¯ãã€ãã©ãã«ãšãžã§ãã¬ãŒã¿ããã颿°çã§å®£èšçãªæ¹æ³ã§æ±ãããã®ãŠãŒãã£ãªãã£ãæäŸããŠããŸãããã®äžäŸãIxJSïŒInteractive Extensions for JavaScriptïŒã§ãã€ãã©ãã«ã倿ããã³çµåããããã®è±å¯ãªãªãã¬ãŒã¿ã»ãããæäŸããŸãã
泚æïŒå€éšã©ã€ãã©ãªã䜿çšãããšããããžã§ã¯ãã«äŸåé¢ä¿ã远å ãããŸããå©ç¹ãšã³ã¹ããæ¯èŒæ€èšããŠãã ããã
// Example using IxJS (install: npm install ix)
const { from, map, filter } = require('ix/iterable');
function* numberRange(start, end) {
for (let i = start; i <= end; i++) {
yield i;
}
}
const numbers = from(numberRange(1, 10));
const squaredNumbers = map(numbers, x => x * x);
const evenSquaredNumbers = filter(squaredNumbers, x => x % 2 === 0);
for (const value of evenSquaredNumbers) {
console.log(value);
}
// Output:
// 4
// 16
// 36
// 64
// 100
ãã®äŸã§ã¯ãIxJSã䜿çšããŠåã®äŸãšåã倿ãå®è¡ããŸãããããç°¡æœã§å®£èšçãªæ¹æ³ã§è¡ã£ãŠããŸããIxJSã¯ãã€ãã©ãã«äžã§åäœããmapãfilterãªã©ã®ãªãã¬ãŒã¿ãæäŸããè€éãªããŒã¿åŠçãã€ãã©ã€ã³ã®æ§ç¯ã容æã«ããŸãã
ãžã§ãã¬ãŒã¿é¢æ°åæã®å®äžçã§ã®äŸ
ãžã§ãã¬ãŒã¿é¢æ°ã®åæã¯ãããŸããŸãªå®äžçã®ã·ããªãªã«é©çšã§ããŸãã以äžã«ããã€ãã®äŸã瀺ããŸãïŒ
1. ããŒã¿å€æãã€ãã©ã€ã³
CSVãã¡ã€ã«ããããŒã¿ãåŠçããŠãããšæ³åããŠãã ããã以äžã®ãããªããŸããŸãªå€æãå®è¡ããããã«ããžã§ãã¬ãŒã¿ã®ãã€ãã©ã€ã³ãäœæã§ããŸãïŒ
- CSVãã¡ã€ã«ãèªã¿åããåè¡ããªããžã§ã¯ããšããŠyieldããã
- ç¹å®ã®åºæºã«åºã¥ããŠè¡ããã£ã«ã¿ãªã³ã°ããïŒäŸïŒç¹å®ã®åœã³ãŒããæã€è¡ã®ã¿ïŒã
- åè¡ã®ããŒã¿ã倿ããïŒäŸïŒæ¥ä»ãç¹å®ã®åœ¢åŒã«å€æãããèšç®ãå®è¡ããïŒã
- 倿ãããããŒã¿ãæ°ãããã¡ã€ã«ãããŒã¿ããŒã¹ã«æžã蟌ãã
ãããã®åã¹ãããã¯ãåå¥ã®ãžã§ãã¬ãŒã¿é¢æ°ãšããŠå®è£ ããããããåæããŠå®å šãªããŒã¿åŠçãã€ãã©ã€ã³ã圢æã§ããŸããäŸãã°ãããŒã¿ãœãŒã¹ãäžçäžã®é¡§å®¢ã®å Žæãèšé²ããCSVã§ããå ŽåãåœïŒäŸïŒãæ¥æ¬ããããã©ãžã«ããããã€ããïŒã§ãã£ã«ã¿ãªã³ã°ãããã®åŸãäžå€®ãªãã£ã¹ãŸã§ã®è·é¢ãèšç®ãã倿ãé©çšãããªã©ã®ã¹ããããæã€ããšãã§ããŸãã
2. éåæããŒã¿ã¹ããªãŒã
ãžã§ãã¬ãŒã¿ã¯ãWebãœã±ãããAPIããã®ããŒã¿ãªã©ãéåæããŒã¿ã¹ããªãŒã ã®åŠçã«ã䜿çšã§ããŸããã¹ããªãŒã ããããŒã¿ãååŸããå©çšå¯èœã«ãªã£ãåé ç®ãyieldãããžã§ãã¬ãŒã¿ãäœæã§ããŸãããã®ãžã§ãã¬ãŒã¿ã¯ãä»ã®ãžã§ãã¬ãŒã¿ãšåæããŠãããŒã¿ã®å€æããã£ã«ã¿ãªã³ã°ãå®è¡ã§ããŸãã
ããŒãžåå²ãããAPIãããŠãŒã¶ãŒãããã¡ã€ã«ãååŸããããšãèããŠã¿ãŸãããããããžã§ãã¬ãŒã¿ãåããŒãžãååŸãããã®ããŒãžã®ãŠãŒã¶ãŒãããã¡ã€ã«ãyield*ã§çæããŸããå¥ã®ãžã§ãã¬ãŒã¿ã¯ããããã®ãããã¡ã€ã«ãéå»1ãæä»¥å
ã®ã¢ã¯ãã£ããã£ã«åºã¥ããŠãã£ã«ã¿ãªã³ã°ã§ããŸãã
3. ã«ã¹ã¿ã ã€ãã¬ãŒã¿ã®å®è£
ãžã§ãã¬ãŒã¿é¢æ°ã¯ãè€éãªããŒã¿æ§é ã®ã«ã¹ã¿ã ã€ãã¬ãŒã¿ãç°¡æœã«å®è£
ããæ¹æ³ãæäŸããŸããããŒã¿æ§é ãæšªæãããã®èŠçŽ ãç¹å®ã®é åºã§yieldãããžã§ãã¬ãŒã¿ãäœæã§ããŸãããã®ã€ãã¬ãŒã¿ã¯ãfor...ofã«ãŒããä»ã®ã€ãã©ãã«ãªã³ã³ããã¹ãã§äœ¿çšã§ããŸãã
äŸãã°ãäºåæšãç¹å®ã®é åºïŒäŸïŒéãããé ãè¡ãããé ãåž°ãããé ïŒã§æšªæãããžã§ãã¬ãŒã¿ããã¹ãã¬ããã·ãŒãã®ã»ã«ãè¡ããšã«å埩åŠçãããžã§ãã¬ãŒã¿ãäœæã§ããŸãã
ãžã§ãã¬ãŒã¿é¢æ°åæã®ãã¹ããã©ã¯ãã£ã¹
ãžã§ãã¬ãŒã¿é¢æ°ãåæããéã«çæãã¹ããã¹ããã©ã¯ãã£ã¹ãããã€ã玹ä»ããŸãïŒ
- ãžã§ãã¬ãŒã¿ãå°ãããçŠç¹ãçµãïŒåãžã§ãã¬ãŒã¿ã¯ãåäžã®æç¢ºã«å®çŸ©ããã責åãæã€ã¹ãã§ããããã«ãããã³ãŒãã®çè§£ããã¹ããä¿å®ã容æã«ãªããŸãã
- 説æçãªååã䜿çšããïŒãžã§ãã¬ãŒã¿ã«ã¯ããã®ç®çãæç¢ºã«ç€ºã説æçãªååãä»ããŸãããã
- ãšã©ãŒãé©åã«åŠçããïŒåãžã§ãã¬ãŒã¿å
ã§ãšã©ãŒåŠçãå®è£
ãããšã©ãŒããã€ãã©ã€ã³å
šäœã«äŒæããã®ãé²ããŸãããžã§ãã¬ãŒã¿å
ã§
try...catchãããã¯ã䜿çšããããšãæ€èšããŠãã ããã - ããã©ãŒãã³ã¹ãèæ ®ããïŒãžã§ãã¬ãŒã¿ã¯äžè¬çã«å¹ççã§ãããè€éãªãã€ãã©ã€ã³ã¯ããã©ãŒãã³ã¹ã«åœ±é¿ãäžããå¯èœæ§ããããŸããã³ãŒãããããã¡ã€ãªã³ã°ããå¿ èŠã«å¿ããŠæé©åããŠãã ããã
- ã³ãŒããææžåããïŒåãžã§ãã¬ãŒã¿ã®ç®çãšããã€ãã©ã€ã³å ã®ä»ã®ãžã§ãã¬ãŒã¿ãšã®çžäºäœçšãæç¢ºã«ææžåããŠãã ããã
é«åºŠãªãã¯ããã¯
ãžã§ãã¬ãŒã¿ãã§ãŒã³ã§ã®ãšã©ãŒãã³ããªã³ã°
ãžã§ãã¬ãŒã¿ãã§ãŒã³ã§ã®ãšã©ãŒåŠçã«ã¯ãæ éãªæ€èšãå¿ èŠã§ãããžã§ãã¬ãŒã¿å ã§ãšã©ãŒãçºçãããšããã€ãã©ã€ã³å šäœãäžæãããå¯èœæ§ããããŸããæ¡çšã§ããæŠç¥ã¯ããã€ããããŸãïŒ
- ãžã§ãã¬ãŒã¿å
ã§ã®Try-CatchïŒæãçŽæ¥çãªã¢ãããŒãã¯ãåãžã§ãã¬ãŒã¿é¢æ°å
ã®ã³ãŒãã
try...catchãããã¯ã§ã©ããããããšã§ããããã«ããããšã©ãŒãããŒã«ã«ã§åŠçããããã©ã«ãå€ãç¹å®ã®ãšã©ãŒãªããžã§ã¯ããyieldããããšãå¯èœã«ãªããŸãã - ãšã©ãŒããŠã³ããªïŒReactã®æŠå¿µã§ãããããã§ãå¿çšå¯èœïŒïŒå§è²ããããžã§ãã¬ãŒã¿ãã¹ããŒããäŸå€ããã£ããããã©ãããŒãžã§ãã¬ãŒã¿ãäœæããŸããããã«ããããšã©ãŒããã°ã«èšé²ãããã©ãŒã«ããã¯å€ã§ãã§ãŒã³ãåéããããšãã§ããŸãã
function* potentiallyFailingGenerator() {
try {
// Code that might throw an error
const result = someRiskyOperation();
yield result;
} catch (error) {
console.error("Error in potentiallyFailingGenerator:", error);
yield null; // Or yield a specific error object
}
}
function* errorBoundary(generator) {
try {
yield* generator();
} catch (error) {
console.error("Error Boundary Caught:", error);
yield "Fallback Value"; // Or some other recovery mechanism
}
}
const myGenerator = errorBoundary(potentiallyFailingGenerator);
for (const value of myGenerator) {
console.log(value);
}
éåæãžã§ãã¬ãŒã¿ãšåæ
JavaScriptã«éåæãžã§ãã¬ãŒã¿ãå°å
¥ãããããšã§ãéåæããŒã¿ãããèªç¶ã«åŠçãããžã§ãã¬ãŒã¿ãã§ãŒã³ãæ§ç¯ã§ããããã«ãªããŸãããéåæãžã§ãã¬ãŒã¿ã¯async function*æ§æã䜿çšããawaitããŒã¯ãŒãã䜿ã£ãŠéåææäœãåŸ
ã€ããšãã§ããŸãã
async function* fetchUsers(userIds) {
for (const userId of userIds) {
const user = await fetchUser(userId); // Assuming fetchUser is an async function
yield user;
}
}
async function* filterActiveUsers(users) {
for await (const user of users) {
if (user.isActive) {
yield user;
}
}
}
async function fetchUser(id) {
//Simulate an async fetch
return new Promise(resolve => {
setTimeout(() => {
resolve({ id: id, name: `User ${id}`, isActive: id % 2 === 0});
}, 500);
});
}
async function main() {
const userIds = [1, 2, 3, 4, 5];
const users = fetchUsers(userIds);
const activeUsers = filterActiveUsers(users);
for await (const user of activeUsers) {
console.log(user);
}
}
main();
//Possible output:
// { id: 2, name: 'User 2', isActive: true }
// { id: 4, name: 'User 4', isActive: true }
éåæãžã§ãã¬ãŒã¿ãå埩åŠçããã«ã¯ãfor await...ofã«ãŒãã䜿çšããå¿
èŠããããŸããéåæãžã§ãã¬ãŒã¿ã¯ãéåžžã®ãžã§ãã¬ãŒã¿ãšåãããã«yield*ã䜿çšããŠåæã§ããŸãã
çµè«
ãžã§ãã¬ãŒã¿é¢æ°ã®åæã¯ãJavaScriptã§ã¢ãžã¥ãŒã«åŒã§åå©çšå¯èœããã€ãã¹ãå¯èœãªããŒã¿åŠçãã€ãã©ã€ã³ãæ§ç¯ããããã®åŒ·åãªãã¯ããã¯ã§ããè€éãªåé¡ãããå°ãã管çãããããžã§ãã¬ãŒã¿ã«åå²ããããšã§ãããä¿å®ããããæè»ãªã³ãŒããäœæã§ããŸããCSVãã¡ã€ã«ããã®ããŒã¿å€æãéåæããŒã¿ã¹ããªãŒã ã®åŠçãã«ã¹ã¿ã ã€ãã¬ãŒã¿ã®å®è£ ãªã©ãã©ã®ãããªå Žåã§ãããžã§ãã¬ãŒã¿é¢æ°ã®åæã¯ãããã¯ãªãŒã³ã§å¹ççãªã³ãŒããæžãã®ã«åœ¹ç«ã¡ãŸãããžã§ãã¬ãŒã¿ããªã²ãŒã·ã§ã³ãæåã€ãã¬ãŒã·ã§ã³ãé«é颿°ã«ãã颿°çåæãªã©ããžã§ãã¬ãŒã¿é¢æ°ãåæããããŸããŸãªãã¯ããã¯ãçè§£ããããšã§ãJavaScriptãããžã§ã¯ãã§ãžã§ãã¬ãŒã¿ã®å¯èœæ§ãæå€§éã«æŽ»çšã§ããŸãããã¹ããã©ã¯ãã£ã¹ã«åŸãããšã©ãŒãé©åã«åŠçãããžã§ãã¬ãŒã¿ãã€ãã©ã€ã³ãèšèšããéã«ã¯ããã©ãŒãã³ã¹ãèæ ®ããããšãå¿ããªãã§ãã ãããããŸããŸãªã¢ãããŒãã詊ããèªåã®ããŒãºãã³ãŒãã£ã³ã°ã¹ã¿ã€ã«ã«æãé©ãããã¯ããã¯ãèŠã€ããŠãã ãããæåŸã«ãIxJSã®ãããªæ¢åã®ã©ã€ãã©ãªãæ¢æ±ããŠããžã§ãã¬ãŒã¿ããŒã¹ã®ã¯ãŒã¯ãããŒãããã«åŒ·åããŸããããç·Žç¿ãéããã°ãJavaScriptã®ãžã§ãã¬ãŒã¿é¢æ°ã䜿çšããŠãæŽç·Žãããå¹ççãªããŒã¿åŠçãœãªã¥ãŒã·ã§ã³ãæ§ç¯ã§ããããã«ãªãã§ãããã